/*
* GeoJSON图层模型
* */

import LayerModel from "../LayerModel";
import store from "../../store/store";

export default class GeoJSONLayerModel extends LayerModel {

  constructor(layerInfo){
    super(layerInfo);

  }

  // 添加图层
  async addLayer(isFlyTo){

    let url = this.layerInfo.url;

    // 判断服务是否已经加载
    if (store.state.viewerLayers[url]) {
      console.error(`GeoJSONLayerModel添加图层错误，原因：该图层已经存在。url = ${url}。`);
    }

    Cesium.GeoJsonDataSource.load(url).then(dataSource => {

      let imageUrl = this.layerInfo.imageUrl || "static/images/GeoJSON/fireControl/flyCircle.png";

      let show = this.layerInfo.show || false; // 图层是否显示

      let visibleDistanceMax = this.layerInfo.visibleDistanceMax; // 最大可见距离
      let bottomAltitude = this.layerInfo.bottomAltitude; // 底部高层

      viewer.dataSources.add(dataSource);
      let entities = dataSource.entities.values;

      // 设置样式
      var entity;
      for (var i = 0; i < entities.length; i++) {

        entity = entities[i];
        entity.billboard = {
          image: imageUrl,
          width: 30,
          height: 40
          // heightReference: Cesium.HeightReference.RELATIVE_TO_GROUND, // 位置固定在地形上
          // scaleByDistance: new Cesium.NearFarScalar(1.5e2, 1.5, 8.0e6, 4) // 设置图标大小（图标小就加上）
        };

        // 底部高程
        if (!!bottomAltitude) {
          entity.position._value.z += bottomAltitude;
        }

        // 设置最大可见距离
        if (visibleDistanceMax) {
          entity.billboard.distanceDisplayCondition = new Cesium.DistanceDisplayCondition(0, visibleDistanceMax);
        }
        entity.billboard.heightReference = Cesium.HeightReference.CLAMP_TO_GROUND; // 位置固定在地形上：地形上方的高度
        // entity.billboard.heightReference = Cesium.HeightReference.RELATIVE_TO_GROUND; // 位置固定在地形上：地形上方的高度
        // entity.billboard.scaleByDistance = new Cesium.NearFarScalar(1.5e2, 1.5, 8.0e6, 4); // 设置图标大小（图标小就加上）
        entity.show = show;

      }

      // 保存当前图层对象到模型
      this.childLayer = dataSource;

      // 将对象添加到图层列表中
      store.state.viewerLayers[url] = this;

    }).otherwise(errInfo => {
      console.error(`GeoJSONLayerModel添加图层错误，url = ${url}。原因：${errInfo}。`);
    });

  }

  // 飞行到指定图层
  flyTo(){

    // 经纬度坐标定位
    let isFly = super.flyTo(); // 调用父类的飞行方法：经纬度坐标定位、笛卡三维笛卡尔坐标定位

    // 没有在配置文件中定义坐标位置坐标
    if (!isFly) {

      let dataSource = this.childLayer;
      if (!!dataSource) {
        viewer.flyTo(dataSource);
      }
    }

  }

  // 设置图层的可见性
  setVisible(isVisible){

    let dataSource = this.childLayer && this.childLayer.dataSource;
    if (dataSource) {
      dataSource.show = isVisible;
    }

    // let entities = this.childLayer.entities;
    // for(let entity of entities) {
    //   entity.show = isVisible;
    // }
  }

  // 删除图层
  removeLayer(){

    let dataSource = this.childLayer && this.childLayer.dataSource;
    if (dataSource) {
      viewer.dataSources.remove(dataSource, true);
    }

    let url = this.layerInfo.url;
    if (store.state.viewerLayers[url]) {
      store.state.viewerLayers[url] = undefined;
      delete store.state.viewerLayers[url];
    }

    return true;
  }

}
